package main

/**
** @ Author       : SmallSuperMan
** @ Date         : 2021-02-23 16:08:20
** @ LastEditTime : 2022-05-10 20:54:52
** @ LastEditors  : SmallSuperMan
** @ FilePath     : \CheckFileMD5\paramTool.go
** @ Description  : 解析参数
**/

import (
	"errors"
	"flag"
	"io/ioutil"
	"log"

	"gopkg.in/yaml.v2"
)

// ParseInputParams 解析传入参数
func ParseInputParams() (string, string, string, string, string) {
	// "I:\\TestGoScrip\\CheckFileMD5",
	sourcePath := flag.String("sourcePath", "./", "需要比较的第一个源头路径名")
	targetPath := flag.String("targetPath", "./", "需要比较的第二个目标路径名")
	compareFlag := flag.String("compareFlag", "1", "检查标识1-源头和目标目录所有文件比较 2-判断目标目录下是否有源头目录文件，并判断否一致 3-判断源头目录下是否有目标目录文件，并判断否一致")
	relativeFlag := flag.String("relativeFlag", "1", "是否考虑相对路径一致,1 是 0 否，不考虑路径的话只根据文件名称进行比较不考虑路径的话只根据文件名称进行比较，只有考虑相对路径时我们才对 detDiffFileSuff配置文件比较明细")
	detDiffFileSuff := flag.String("detDiffFileSuff", "NO", "需要检查详细差异的文件名后缀需要带上点，多个使用|分开,例如.sql|.py,不检查就配置NO")
	flag.Parse()
	return *sourcePath, *targetPath, *compareFlag, *relativeFlag, *detDiffFileSuff
}

/*
结构字段只有在导出时才进行数据编出(首字母大写)，
并且使用小写的字段名作为默认键进行数据编出
*/
type conf struct {
	SourcePath      string `yaml:"sourcePath"`
	TargetPath      string `yaml:"targetPath"`
	CompareFlag     string `yaml:"compareFlag"`
	RelativeFlag    string `yaml:"relativeFlag"`
	DetDiffFileSuff string `yaml:"detDiffFileSuff"`
}

func getConf() (string, string, string, string, string, error) {
	// 配置文件位置
	yamlFilePath := getCurrentPath() + getPathDelimiter() + "config.yaml"
	log.Printf("开始读取配置文件: %s", yamlFilePath)
	if !Exists(yamlFilePath) {
		log.Printf("[ERROR:]配置文件不存在,开始创建空配置文件，请按照需要完成配置->: %s", yamlFilePath)
		confString := `# 需要比较的第一个源头路径名
sourcePath: I:\TestGoScrip\CheckFileMD5 
# 需要比较的第二个目标路径名
targetPath: I:\TestGoScrip\CharImage
# 检查标识1-源头和目标目录所有文件比较 2-判断目标目录下是否有源头目录文件，并判断否一致 3-判断源头目录下是否有目标目录文件，并判断否一致                                           
compareFlag: 1
# 是否考虑相对路径一致,1 是 0 否，不考虑路径的话只根据文件名称进行比较，只有考虑相对路径时我们才对 detDiffFileSuff配置文件比较明细                                          
relativeFlag: 1
# 需要检查详细差异的文件名后缀需要带上点，多个使用|分开,例如.sql|.py ,默认不检查配置NO
detDiffFileSuff: .sql|.py`
		writeStringToFile(yamlFilePath, confString)
		return "", "", "", "", "", errors.New("[ERROR:]配置文件不存在,已创建配置文件，请按照要求配置")
	}
	var c *conf
	yamlFile, err := ioutil.ReadFile(yamlFilePath)
	if err != nil {
		log.Printf("读取配置文件失败，报错信息: %#v ", err)
		return "", "", "", "", "", err
	}
	err = yaml.Unmarshal(yamlFile, &c)
	if err != nil {
		log.Fatalf("解析yaml文件失败: %#v", err)
	}
	return c.SourcePath, c.TargetPath, c.CompareFlag, c.RelativeFlag, c.DetDiffFileSuff, nil
}

func getParams() (string, string, string, string, string) {
	if getPathDelimiter() == "/" {
		sourcePath, targetPath, compareFlag, relativeFlag, detDiffFileSuff := ParseInputParams()
		return sourcePath, targetPath, compareFlag, relativeFlag, detDiffFileSuff
	}
	sourcePath, targetPath, compareFlag, relativeFlag, detDiffFileSuff, _ := getConf()
	return sourcePath, targetPath, compareFlag, relativeFlag, detDiffFileSuff
}
